package com.chris.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtUtil {
    // 私钥，应该是配置在配置文件中的
    private static String secretKey = "your-256-bit-secret";

    // Token有效时长（例如1小时）
    private static int tokenValiditySeconds = 3600;

    // RefreshToken有效时长（例如3天）
    private static int refreshTokenValiditySeconds = 259200;

    /**
     * 根据用户名生成token
     * @param username
     * @return
     */
    public static String createToken(String username) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + tokenValiditySeconds * 1000);

        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

    /**
     * 根据token生成刷新token
     * @param token
     * @return
     */
    public static String createRefreshToken(String token) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + refreshTokenValiditySeconds * 1000);

        Map<String, Object> claims = new HashMap<>();
        claims.put("oldToken", token);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

    /**
     * 根据token获取用户名
     * @param token
     * @return
     */
    public static String getUsernameByToken(String token){
        // 解析JWT
        Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();

        // 如果你知道字段的名字，也可以直接通过字段名获取
        String username = (String) claims.get("username");
        return username;
    }

    /**
     * 校验token是否有效
     * @param token
     * @return
     */
    public static boolean validToken(String token){
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(secretKey)
                    .parseClaimsJws(token)
                    .getBody();

            System.out.println("JWT验证成功!");
            System.out.println("JWT主体: " + claims);

            // 可以检查claims中的额外信息，例如过期时间
            if (claims.getExpiration().after(new Date())) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 校验token是否过期
     * @param token
     * @return
     */
    public static boolean isTokenExpired(String token){
        Claims claims = Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody();
        if (claims.getExpiration().after(new Date())) {
            return false;
        } else {
            return true;
        }
    }
}